package módulo9;

import java.util.ArrayList;
import java.io.BufferedReader;
import java.io.FileReader;

/**
 *
 * @author Nícolas Riccieri Gardin Assumpção    Ra: 121245
 */
public class Integralizacao {
    private String raAluno;
    private int codigoCurso;
    private ArrayList disciplinas;
    
    public Integralizacao(String ra, int cod){
        this.codigoCurso = cod;
        this.raAluno = ra;
        this.disciplinas = new ArrayList();
    }
    
    public Integralizacao(){
        this.disciplinas = new ArrayList();
    }
    
    public int getQuantasDisciplinas(){
        return this.disciplinas.size();
    }

    public int getCodigoCurso() {
        return codigoCurso;
    }

    public void setCodigoCurso(int codigoCurso) {
        this.codigoCurso = codigoCurso;
    }

    public ArrayList getDisciplinasCursadas() {
        return disciplinas;
    }
    
    public ArrayList getDisciplinasAprovadas(){
        ArrayList retorno = new ArrayList();
        DisciplinaCursada aux;
        for(int i=0;i<this.disciplinas.size();i++){
            aux = (DisciplinaCursada)(this.disciplinas.get(i));
            if(aux.cumprimento()){
                retorno.add(aux);
            }
        }
        return retorno;
    }
    
    public ArrayList getDisciplinasObrigatoriasCursadas(){
        ArrayList retorno = new ArrayList();
        DisciplinaCursada aux;
        for(int i=0;i<this.disciplinas.size();i++){
            aux = (DisciplinaCursada)(this.disciplinas.get(i));
            if(aux.getAproveitamento().compareTo("OBRIGATORIA")==0 && aux.cumprimento()){
                retorno.add(aux);
            }
        }
        return retorno;
    }
    
    public DisciplinaCursada getDisciplina(int i){
        return (DisciplinaCursada)(this.disciplinas.get(i));
    }
    
    public void novaDisciplina(String l, String m, String t, int c, char a,
                            char cat, double n, int ch, int ca, String p){
        this.disciplinas.add(new DisciplinaCursada(l,m,t,c,a,cat,n,ch,ca,p));
    }

    public String getRaAluno() {
        return raAluno;
    }

    public void setRaAluno(String raAluno) {
        this.raAluno = raAluno;
    }
    
    public Integralizacao(String arquivo) throws Exception {
        //Buffer de leitura do arquivo
        BufferedReader in = new BufferedReader(new FileReader(arquivo));
        
        //variaveis do metodo
        int curso;
        String ra,str="";
        
        
        //Procura o RA
        while (in.ready() && !str.contains("REGISTRO ACADEMICO:")) {
            //leitura da linha
            str = in.readLine();
        }
        //encontrou o RA
        if(str.contains("REGISTRO ACADEMICO:")){
            int local_ra = str.indexOf("REGISTRO ACADEMICO:");
            ra = str.substring(local_ra+20, local_ra+26);
           this.raAluno = ra;
        }
        else{throw new Exception();}//ERRO
        
        
        //Procura curso
        while (in.ready() && !str.contains("  CURSO:")) {
            //leitura da linha
            str = in.readLine();
        }
        //encontrou curso na integralizacao
        if(str.contains("  CURSO:")){
            curso = Integer.parseInt(str.substring(10, 13).replace(" ", ""));
            this.codigoCurso = curso;
        }
        else{throw new Exception();}//ERRO
        
        //Procura inicio das disciplinas
        while (in.ready() && str.compareTo("  HISTORICO ATUAL:")!=0) {
            //leitura da linha
            str = in.readLine();
        }
        //inicia leitura das disciplinas
        if(str.compareTo("  HISTORICO ATUAL:")==0){
            str = in.readLine();
            //LEITURA DAS DISCIPLINAS
            while (in.ready() && str.length()>=37) {
                //PRIMEIRA COLUNA
                ProcessamentoLinha(str.substring(0,37));
                if(str.length()>40){//se houver segunda coluna
                    //SEGUNDA COLUNA
                    ProcessamentoLinha(str.substring(40,77));
                }
                str = in.readLine();
            }
        }
        else{throw new Exception();}//ERRO
        
        in.close();
    }
    
    public final void ProcessamentoLinha(String str){
        int creditos,cargaHoraria,codigoAprovacao;
        String materia, turma,periodo;
        char aproveitamento,categoria;
        double nota;
        
        materia = str.substring(2,7);
        turma = str.substring(8,11);
        creditos = Integer.parseInt(str.substring(12,14));
        aproveitamento = str.charAt(15);
        categoria = str.charAt(17);
        if((str.substring(19,23)).compareTo(" ---")==0){  //caso nao tenha nota coloca -1
            nota = -1.0;
        }
        else{
            nota = Double.parseDouble(str.substring(19,23).replaceAll(" ", "").replaceAll(",", "."));
        }
        cargaHoraria = Integer.parseInt(str.substring(24,27).replaceAll(" ", ""));
        codigoAprovacao = Integer.parseInt(str.substring(28,30).replaceAll(" ", ""));
        periodo = str.substring(31,37);
        
        //Inclui nova disciplina
        this.novaDisciplina(str.substring(2,37),materia, turma, creditos, aproveitamento, categoria, nota, cargaHoraria, codigoAprovacao, periodo);
    }
}
